﻿--默认设置
UnitFramesPlusDefaultDB = {
    global = {
        movable = 1,    --Shift拖动头像
        indicator = 1,    --头像内战斗信息
        portrait = 1,    --更改头像显示
        ptype = 1,        --头像类型：1为3D，2为职业图标
        p3dbg = 1,        --3D头像背景
        npcno = 1,        --NPC不显示职业图标
        mouseshow = 0,    --鼠标滑过时才显示数值
        colorhp = 1,    --生命条染色
        colortype = 2,    --生命条染色类型：1职业，2生命值百分比
    },

    player = {
        scale = 1,        --玩家头像缩放比例
        dragon = 1,        --精英头像
        raretype = 1,    --精英头像类型：1精英头像，2银英头像，3稀有头像
        extbar = 1,        --扩展框
        hpmp = 1,        --不显示扩展框时增加生命值和法力值(百分比)显示
        hpmppartone = 1,--生命值和法力值第一部分：1当前值，2最大值，3百分比
        hpmpparttwo = 2,--生命值和法力值第二部分：1当前值，2最大值，3百分比，4不显示
        unit = 1,        --生命值和法力值进位
        unittype = 2,    --1为千进制(k/m)，2为万进位(万/亿)
        colorhp = 1,    --生命条染色
        colortype = 2,    --生命条染色类型：1职业，2生命值百分比
        movable = 1,    --Shift拖动头像
        indicator = 1,    --头像内战斗信息
        portrait = 1,    --更改头像显示
        ptype = 1,        --头像类型：1为3D，2为职业图标
        p3dbg = 1,        --3D头像背景
        coord = 1,        --坐标
        coordpct = 1,    --副本战场内显示为百分比
        autohide = 0,    --玩家头像自动隐藏
        mouseshow = 0,    --鼠标滑过时才显示数值
    },

    pet = {
        indicator = 1,    --头像内战斗信息
        target = 0,        --宠物目标
        scale = 0.8,    --宠物目标缩放比例
        hppct = 1,        --宠物目标生命值百分比
        mouseshow = 0,    --鼠标滑过时才显示数值
    },

    target = {
        scale = 1,        --目标头像缩放比例
        systot = 1,        --在进入游戏时自动关闭系统ToT
        classicon = 1,    --职业图标
        moreaction = 1,    --职业图标左键观察，右键交易，中键密语，4键跟随
        race = 1,        --种族和类型
        hppct = 1,        --生命值百分比
        mppct = 1,        --法力值百分比
        colorhp = 1,    --生命条染色
        colortype = 2,    --生命条染色类型：1职业，2生命值百分比
        indicator = 1,    --头像内战斗信息
        buffsize = 1,    --调节目标buff/debuff图标大小
        mysize = 24,    --自己施放的buff/debuff大小，默认 21
        othersize = 16,    --其他人施放的buff/debuff大小，默认 17
        movable = 1,    --Shift拖动目标头像
        portrait = 1,    --更改头像显示
        ptype = 1,        --头像类型：1为3D，2为职业图标
        p3dbg = 1,        --3D头像背景
        npcno = 1,        --NPC不显示职业图标
        tot = 1,        --额外的ToT
        totot = 1,        --额外的ToToT
        tscale = 0.9,    --额外的ToT缩放比例
        debuff = 1,        --额外的ToT debuff
        tothppct = 1,    --额外的ToT生命值百分比
        mouseshow = 0,    --鼠标滑过时才显示数值
    },

    focus = {
        scale = 1,        --焦点头像缩放比例
        quick = 1,        --快速设置焦点
        button = 1,        --快速设置焦点快捷键，1alt，2shift，3ctrl
        classicon = 1,    --职业图标
        moreaction = 1,    --职业图标左键观察，右键交易，中键密语，4键跟随
        race = 1,        --种族和类型
        hppct = 1,        --生命值百分比
        mppct = 1,        --法力值百分比
        colorhp = 1,    --生命条染色
        colortype = 2,    --生命条染色类型：1职业，2生命值百分比
        indicator = 1,    --头像内战斗信息
        movable = 1,    --Shift拖动头像
        portrait = 1,    --更改头像显示
        ptype = 1,        --头像类型：1为3D，2为职业图标
        p3dbg = 1,        --3D头像背景
        npcno = 1,        --NPC不显示职业图标
        tof = 1,        --焦点目标
        tscale = 0.9,    --焦点目标缩放比例
        tofhppct = 1,    --焦点目标生命值百分比
        mouseshow = 0,    --鼠标滑过时才显示数值
    },

    party = {
        origin = 1,        --关闭团队风格小队界面
        level = 1,        --队友等级
        colorname = 1,    --队友名字染色
        shortname = 1,    --队友名字服务器显示为(*)
        hp = 1,            --队友生命值
        hppct = 1,        --队友生命值显示为百分比
        movable = 1,    --Shift拖动头像
        portrait = 0,    --队友职业图标头像
        onoff = 1,        --队友离线检测
        indicator = 1,    --头像内战斗信息
        buff = 1,        --队友buff
        hidetip = 0,    --隐藏队友buff鼠标提示
        target = 1,        --队友目标
        castbar = 1,    --队友施法条
        scale = 1,        --队友头像缩放比例
        colorhp = 1,    --生命条染色
        colortype = 1,    --生命条染色类型：1职业，2生命值百分比
        death = 1,        --队友死亡/鬼魂状态
        mouseshow = 0,    --鼠标滑过时才显示数值
    },

    ext = {
        bosshppct = 1,    --BOSS生命值百分比
    },

    minimap = {            --地图按钮
        button = 1,
        radius = 78;
        position = 348;
    },

    version = tonumber(GetAddOnMetadata("UnitFramesPlus", "Version")),
    reset = 0,            --重置设置标记
}

UnitFramesPlusDefaultVar = {
    player = {
        moving = 0,        --玩家拖动状态
        moved = 0,        --玩家已被拖动
    },

    target = {
        moving = 0,        --目标拖动状态
        moved = 0,        --目标已被拖动
        tmoving = 0,    --ToT拖动状态
        tmoved = 0,        --ToT已被拖动
        totx = 0,        --ToT位置
        toty = 0,        --ToT位置
    },

    focus = {
        moving = 0,        --焦点拖动状态
        tmoving = 0,    --焦点目标拖动状态
        tmoved = 0,        --焦点目标已被拖动
        tofx = 0,        --焦点目标位置
        tofy = 0,        --焦点目标位置
    },

    party = {
        moving = 0,        --队友拖动状态
    },
}

--设置初始化
local function UnitFramesPlus_Options_Init()
    if (not UnitFramesPlusDB) then
        UnitFramesPlusDB = UnitFramesPlusDefaultDB;
    end

    if (not UnitFramesPlusVar) then
        UnitFramesPlusVar = UnitFramesPlusDefaultVar;
    end

    if (UnitFramesPlusDB["reset"] == 1) then
        UnitFramesPlusDB = UnitFramesPlusDefaultDB;
        UnitFramesPlusVar = UnitFramesPlusDefaultVar;
        UnitFramesPlusDB["reset"] = 0;
    end
    
    local Version = tonumber(GetAddOnMetadata("UnitFramesPlus", "Version"));
    if (not UnitFramesPlusDB["version"]) or (UnitFramesPlusDB["version"] ~= Version) then
        local k, v, x, y;
        for k, v in pairs(UnitFramesPlusDefaultDB) do
            if type(v) == "table" then
                for x, y in pairs(UnitFramesPlusDefaultDB[k]) do
                    if not UnitFramesPlusDB[k] then UnitFramesPlusDB[k] = {} end
                    UnitFramesPlusDB[k][x] = UnitFramesPlusDB[k][x] or UnitFramesPlusDefaultDB[k][x];
                end
            else
                UnitFramesPlusDB[k] = UnitFramesPlusDB[k] or UnitFramesPlusDefaultDB[k];
            end
        end
        for k, v in pairs(UnitFramesPlusDefaultVar) do
            if type(v) == "table" then
                for x, y in pairs(UnitFramesPlusDefaultVar[k]) do
                    if not UnitFramesPlusVar[k] then UnitFramesPlusVar[k] = {} end
                    UnitFramesPlusVar[k][x] = UnitFramesPlusVar[k][x] or UnitFramesPlusDefaultVar[k][x];
                end
            else
                UnitFramesPlusVar[k] = UnitFramesPlusVar[k] or UnitFramesPlusDefaultVar[k];
            end
        end
        UnitFramesPlusDB["version"] = UnitFramesPlusDefaultDB["version"];
    end
end

--模块初始化
local function UnitFramesPlus_Init()
    if UnitFramesPlus_PlayerInit then
        UnitFramesPlus_PlayerInit();
    end
    if UnitFramesPlus_PetInit then
        UnitFramesPlus_PetInit();
    end
    if UnitFramesPlus_PetTargetInit then
        UnitFramesPlus_PetTargetInit();
    end
    if UnitFramesPlus_TargetInit then
        UnitFramesPlus_TargetInit();
    end
    if UnitFramesPlus_TargetTargetInit then
        UnitFramesPlus_TargetTargetInit();
    end
    if UnitFramesPlus_FocusInit then
        UnitFramesPlus_FocusInit();
    end
    if UnitFramesPlus_FocusTargetInit then
        UnitFramesPlus_FocusTargetInit();
    end
    if UnitFramesPlus_PartyInit then
        UnitFramesPlus_PartyInit();
    end
    if UnitFramesPlus_PartyTargetInit then
        UnitFramesPlus_PartyTargetInit();
    end
    if UnitFramesPlus_PartyCastbarInit then
        UnitFramesPlus_PartyCastbarInit();
    end
    if UnitFramesPlus_ExtInit then
        UnitFramesPlus_ExtInit();
    end
    if UnitFramesPlus_MinimapButton then
        UnitFramesPlus_MinimapButton();
    end
end

local function UnitFramesPlus_CVar()
    if UnitFramesPlus_TargetCvar then
        UnitFramesPlus_TargetCvar();
    end
    if UnitFramesPlus_PartyCvar then
        UnitFramesPlus_PartyCvar();
    end
end

local function UnitFramesPlus_Layout()
    if UnitFramesPlus_PlayerLayout then
        UnitFramesPlus_PlayerLayout();
    end
    if UnitFramesPlus_PetTargetLayout then
        UnitFramesPlus_PetTargetLayout();
    end
    if UnitFramesPlus_TargetLayout then
        UnitFramesPlus_TargetLayout();
    end
    if UnitFramesPlus_TargetTargetLayout then
        UnitFramesPlus_TargetTargetLayout();
    end
    if UnitFramesPlus_FocusTargetLayout then
        UnitFramesPlus_FocusTargetLayout();
    end
    if UnitFramesPlus_PartyTargetLayout then
        UnitFramesPlus_PartyTargetLayout();
    end
end

--退出战斗后再执行
local ufpcbl = {};
function UnitFramesPlus_WaitforCall(func)
    local id = 1;
    while (ufpcbl[id]) do
        if ufpcbl[id].name ~= func.name then
            id = id + 1;
        else
            ufpcbl[id].callback = func.callback;
            return;
        end
    end

    local newfunc = {};
    newfunc.name = func.name;
    newfunc.callback = func.callback;
    ufpcbl[id] = newfunc;
end

--[[--样例
    local func = {};
    func.name = "print";
    func.callback = function() print("test.") end;
    UnitFramesPlus_WaitforCall(func);
--]]

local function UnitFramesPlus_Call()
    local id = 1;
    while (ufpcbl[id]) do
        ufpcbl[id].callback();
        id = id + 1;
    end
    ufpcbl = {};
end

local ufpcb = CreateFrame("Frame");
ufpcb:RegisterEvent("PLAYER_REGEN_ENABLED");
ufpcb:SetScript("OnEvent", function(self, event)
    UnitFramesPlus_Call();
end)

--系统面板修复
local function UnitFramesPlus_OpenInterfacePanel(panel)
        local panelName = panel.name;
        if not panelName then return end
        local t = {};
        for i, p in pairs(INTERFACEOPTIONS_ADDONCATEGORIES) do
            if p.name == panelName then
                p.collapsed = true;
                t.element = p;
                InterfaceOptionsListButton_ToggleSubCategories(t);
            end
        end
    InterfaceOptionsFrame_OpenToCategory(panel);
end

--设置面板载入
local function UnitFramesPlus_LoadOptionPanel()
    if not IsAddOnLoaded("UnitFramesPlus_Options") then
        local playerName = UnitName("player");
        local enabled = GetAddOnEnableState(playerName, "UnitFramesPlus_Options")
        if enabled == 0 then
            EnableAddOn("UnitFramesPlus_Options");
        end
        local loaded = LoadAddOn("UnitFramesPlus_Options");
        if not loaded then
            print(UFPLocal_OptionFailed);
            return false;
        end
    end
end

--命令行
function UnitFramesPlus_SlashHandler()
    local result = UnitFramesPlus_LoadOptionPanel();
    if result == false then return end
    UnitFramesPlus_OpenInterfacePanel(UnitFramesPlus_OptionsFrame);
end
SlashCmdList["UnitFramesPlus"] = UnitFramesPlus_SlashHandler;
SLASH_UnitFramesPlus1 = "/unitframesplus";
SLASH_UnitFramesPlus2 = "/ufp";

--插件初始化
local ufp = CreateFrame("Frame");
ufp:RegisterEvent("ADDON_LOADED");
ufp:RegisterEvent("VARIABLES_LOADED");
-- ufp:RegisterEvent("PLAYER_ENTERING_WORLD");
ufp:SetScript("OnEvent", function(self, event, ...)
    if event == "ADDON_LOADED" then
        local name = ...;
        if name == "UnitFramesPlus" then
            UnitFramesPlus_Options_Init();
            UnitFramesPlus_Init();
            ufp:UnregisterEvent("ADDON_LOADED");
            print(UFPLocal_Loaded);
        end
    elseif event == "VARIABLES_LOADED" then
        UnitFramesPlus_CVar();
        UnitFramesPlus_Layout();
        ufp:UnregisterEvent("VARIABLES_LOADED");
    -- elseif event == "PLAYER_ENTERING_WORLD" then
    --     ufp:UnregisterEvent("PLAYER_ENTERING_WORLD");
    end
end)